// test bitwise operators

#define INTERVAL(__p,__x,__a,__b) {if (__p) __x=__a; else __x=__b;}
int main(){
  int x1,y1,z1,z2,z3;
  int p1,p2;
  int x2,y2,z4,z5;
  
  // INTERVAL(p1,x,2,6);
  // INTERVAL(p2,y,9,20);

  INTERVAL(p1,x1,2,3);
  INTERVAL(p2,y1,9,10);

  z1 = x1 | y1;  
  // [min,max]{ 0010 | 1001 = 1011,
  //            0010 | 1010 = 1010,
  //            0011 | 1001 = 1011,
  //            0011 | 1010 = 1011 } =  [ 1010, 1011 ] = [10,11]
  z2 = x1 & y1;
  // [min,max]{ 0010 | 1001 = 0000,
  //            0010 | 1010 = 0010,
  //            0011 | 1001 = 0001,
  //            0011 | 1010 = 0010 } =  [ 0000, 0010 ] = [0,2]
  z3 = x1 ^ y1;
  // [min,max]{ 0010 | 1001 = 1011,
  //            0010 | 1010 = 1000,
  //            0011 | 1001 = 1010,
  //            0011 | 1010 = 1001 } =  [ 1000, 1011 ] = [8,11]


  INTERVAL(p1,x2,-2,3);
  INTERVAL(p2,y2,9,10);

  z4 = x2 | y2;
  // [min,max]{ 11110 | 01001 = 11111,
  //            11110 | 01010 = 11110,
  //            11111 | 01001 = 11111,
  //            11111 | 01010 = 11111,
  //            00000 | 01001 = 01001,
  //            00000 | 01010 = 01010,
  //            00001 | 01001 = 01001,
  //            00001 | 01010 = 01011,
  //            00010 | 01001 = 01011,
  //            00010 | 01010 = 01010,
  //            00011 | 01001 = 01011,
  //            00011 | 01010 = 01011} = [11110,01011] = [-2,11]
  z5 = x2 & y2;
  // [min,max]{ 11110 | 01001 = 01000,
  //            11110 | 01010 = 01010,
  //            11111 | 01001 = 01001,
  //            11111 | 01010 = 01010,
  //            00000 | 01001 = 00000,
  //            00000 | 01010 = ....,
  //            00001 | 01001 = ....,
  //            00001 | 01010 = ....,
  //            00010 | 01001 = ....,
  //            00010 | 01010 = ....,
  //            00011 | 01001 = .....,
  //            00011 | 01010 = ..... } = [0,10]

 
  return 0;
}
